package lucasapp.CentralStation_PRO;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;

import android.app.IntentService;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.SystemClock;
import android.util.Log;
import android.widget.RemoteViews;

public class WidgetProvider extends AppWidgetProvider {
	
	public WidgetProvider(){
		Log.d(Main.TAG, "Costruttore");
	}
	
	@Override
	public void onReceive(Context context, Intent intent) {
		Log.d(Main.TAG, "onReceive");
	}

	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
		final int N = appWidgetIds.length;
		Log.d(Main.TAG, "onUpdate" + N);
		// For each widget that needs an update, get the text that we should display:
		//   - Create a RemoteViews object for it
		//   - Set the text in the RemoteViews object
		//   - Tell the AppWidgetManager to show that views object for the widget.
		
		for (int i=0; i<N; i++) {
			int appWidgetId = appWidgetIds[i];
			String titlePrefix = WidgetConfigure.loadTitlePref(context, appWidgetId);
			updateAppWidget(context, appWidgetManager, appWidgetId, titlePrefix);
		}

	}

	@Override
	public void onDeleted(Context context, int[] appWidgetIds) {
		Log.d(Main.TAG, "onDeleted");
		// When the user deletes the widget, delete the preference associated with it.
		final int N = appWidgetIds.length;
		for (int i=0; i<N; i++) {
			WidgetConfigure.deleteTitlePref(context, appWidgetIds[i]);
		}
		super.onDeleted(context, appWidgetIds);
	}

	@Override
	public void onEnabled(Context context) {
		Log.d(Main.TAG, "onEnabled");
		// When the first widget is created, register for the TIMEZONE_CHANGED and TIME_CHANGED
		// broadcasts.  We don't want to be listening for these if nobody has our widget active.
		// This setting is sticky across reboots, but that doesn't matter, because this will
		// be called after boot if there is a widget instance for this provider.
		PackageManager pm = context.getPackageManager();
		pm.setComponentEnabledSetting(new ComponentName("lucasapp", ".CentralStaion_PRO.BroadcastReceiver"),
				PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
				PackageManager.DONT_KILL_APP);
		super.onEnabled(context);
	}

	@Override
	public void onDisabled(Context context) {
		// When the first widget is created, stop listening for the TIMEZONE_CHANGED and
		// TIME_CHANGED broadcasts.
		Log.d(Main.TAG, "onDisabled");
		PackageManager pm = context.getPackageManager();
		pm.setComponentEnabledSetting(new ComponentName("lucasapp", ".CenralStation_PRO.WidgetBroadcastReceiver"),
				PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
				PackageManager.DONT_KILL_APP);
		super.onDisabled(context);
	}

	static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,int appWidgetId, String titlePrefix) {
		Log.d(Main.TAG, "updateAppWidget appWidgetId=" + appWidgetId + " titlePrefix=" + titlePrefix);
		// Getting the string this way allows the string to be localized.  The format
		// string is filled in using java.util.Formatter-style format strings.
		CharSequence text = (WidgetConfigure.loadTitlePref(context, appWidgetId) +
				"0x" + Long.toHexString(SystemClock.elapsedRealtime()));

		// Construct the RemoteViews object.  It takes the package name (in our case, it's our
		// package, but it needs this because on the other side it's the widget host inflating
		// the layout from our package).
		RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
		views.setTextViewText(R.id.widget_nome, text);
		
		// Create an Intent to launch ExampleActivity
        Intent intent = new Intent(context, WidgetBroadcastReceiver.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
		
		views.setOnClickPendingIntent(R.id.widget_aggiorna, pendingIntent);

		// Tell the widget manager
		appWidgetManager.updateAppWidget(appWidgetId, views);
	}

	//if (controllaConnessione(context))
	//downloadDati(remoteViews);

	private static void downloadDati(RemoteViews remoteViews) {
		String[][] mBufferStazione=null;
		Parser mParser;
		float mCorrezioneOra=0;
		String mOra="";
		String mRicercaNome="Roma Termini";

		String indirizzo= "http://mobile.viaggiatreno.it/viaggiatreno/mobile/stazione";	//indirizzo http per la pagina delle stazioni
		ArrayList<NameValuePair> parametriPost= new ArrayList<NameValuePair>();	//parametri per il post http
		parametriPost.add(new BasicNameValuePair("stazione", mRicercaNome));	//aggiungo il nome della stazione
		parametriPost.add(new BasicNameValuePair("lang", "IT"));				//lingua italiana
		//	if(mRicercaCodice.length()>1)
		//	parametriPost.add(new BasicNameValuePair("codiceStazione", mRicercaCodice));	//aggiungo il codice della stazione
		String mHtml = new String();
		try {
			mHtml = MyHttpClient.PostHttp(indirizzo, parametriPost);	//eseguo il post http
		} catch (Exception e) {
			//Main.LOG("Eccezione download (post) dati " + e);
		}
		if (!mHtml.contentEquals("")) {
			int ricerca1=mHtml.indexOf("Risultati ricerca");
			int ricerca2=mHtml.indexOf("Cerca Treno (Stazione)");
			int ricerca3=mHtml.indexOf("localita&#039; non trovata");

			if (ricerca1>0 && ricerca2==-1 && ricerca3==-1){	//trovati i dati stazione
				mOra = new SimpleDateFormat("HH:mm").format(new Date((long) (System.currentTimeMillis() + mCorrezioneOra))); //correggo l'ora locale
				mParser = new Parser(); 			//istanzio nuovo parser
				mParser.Stazione(mHtml,mOra);	//applico il parser all'html
				//parsing dei dati treni in partenza
				mBufferStazione = new String [6][mParser.numeroPartenze];
				mBufferStazione = mParser.getPartenze();
			}
			else{
				//Main.LOG("Problemi lettura HTML");
			}
		}

		//impostazioni base per grafica
		remoteViews.setTextViewText(R.id.widget_nome, mRicercaNome);	//imposto il nome della stazione
		remoteViews.setTextViewText(R.id.widget_ora, mOra);				//imposto l'ora
		remoteViews.setTextViewText(R.id.widget_partenzeArrivi, "Partenze");	//sistemo etichetta partenze arrivi	
		for (int j=0;j<6;j++){
			if (j<mBufferStazione[0].length) {
				switch (j){
				case 0:	//primo treno
					remoteViews.setTextViewText(R.id.widget_num1, mBufferStazione[0][j].trim()+" "+mBufferStazione[1][j].trim()); //categoria+numero
					remoteViews.setTextViewText(R.id.widget_sta1, mBufferStazione[2][j].trim()); 	//stazione
					remoteViews.setTextViewText(R.id.widget_ora1, mBufferStazione[3][j].trim());	//ora
					if (mBufferStazione[4][j].equals("0")) 		//se ritardo uguale a 0 minuti
						remoteViews.setTextViewText(R.id.widget_rit1, " ");	//spazio vuoto
					else
						remoteViews.setTextViewText(R.id.widget_rit1, mBufferStazione[4][j]+"'");	//aggiungo apostrofo
					remoteViews.setTextViewText(R.id.widget_bin1, mBufferStazione[5][j].trim());	//binario reale oppure previsto
					break;
				case 1: //secondo treno
					remoteViews.setTextViewText(R.id.widget_num2, mBufferStazione[0][j].trim()+" "+mBufferStazione[1][j].trim()); 	//categoria+numero
					remoteViews.setTextViewText(R.id.widget_sta2, mBufferStazione[2][j].trim()); 	//stazione
					remoteViews.setTextViewText(R.id.widget_ora2, mBufferStazione[3][j].trim());	//ora
					if (mBufferStazione[4][j].equals("0")) 		//se ritardo uguale a 0 minuti
						remoteViews.setTextViewText(R.id.widget_rit2, " ");	//spazio vuoto
					else
						remoteViews.setTextViewText(R.id.widget_rit2, mBufferStazione[4][j]+"'");	//aggiungo apostrofo
					remoteViews.setTextViewText(R.id.widget_bin2, mBufferStazione[5][j].trim());	//binario reale oppure previsto
					break;
				case 2: //terzo treno
					remoteViews.setTextViewText(R.id.widget_num3, mBufferStazione[0][j].trim()+" "+mBufferStazione[1][j].trim()); 	//categoria+numero
					remoteViews.setTextViewText(R.id.widget_sta3, mBufferStazione[2][j].trim()); 	//stazione
					remoteViews.setTextViewText(R.id.widget_ora3, mBufferStazione[3][j].trim());	//ora
					if (mBufferStazione[4][j].equals("0")) 		//se ritardo uguale a 0 minuti
						remoteViews.setTextViewText(R.id.widget_rit3, " ");	//spazio vuoto
					else
						remoteViews.setTextViewText(R.id.widget_rit3, mBufferStazione[4][j]+"'");	//aggiungo apostrofo
					remoteViews.setTextViewText(R.id.widget_bin3, mBufferStazione[5][j].trim());	//binario reale oppure previsto
					break;
				case 3:
					//quarto treno
					remoteViews.setTextViewText(R.id.widget_num4, mBufferStazione[0][j].trim()+" "+mBufferStazione[1][j].trim()); 	//categoria+numero
					remoteViews.setTextViewText(R.id.widget_sta4, mBufferStazione[2][j].trim()); 	//stazione
					remoteViews.setTextViewText(R.id.widget_ora4, mBufferStazione[3][j].trim());	//ora
					if (mBufferStazione[4][j].equals("0")) 		//se ritardo uguale a 0 minuti
						remoteViews.setTextViewText(R.id.widget_rit4, " ");	//spazio vuoto
					else
						remoteViews.setTextViewText(R.id.widget_rit4, mBufferStazione[4][j]+"'");	//aggiungo apostrofo
					remoteViews.setTextViewText(R.id.widget_bin4, mBufferStazione[5][j].trim());	//binario reale oppure previsto
					break;
				case 4:
					//quinto treno
					remoteViews.setTextViewText(R.id.widget_num5, mBufferStazione[0][j].trim()+" "+mBufferStazione[1][j].trim()); 	//categoria+numero
					remoteViews.setTextViewText(R.id.widget_sta5, mBufferStazione[2][j].trim()); 	//stazione
					remoteViews.setTextViewText(R.id.widget_ora5, mBufferStazione[3][j].trim());	//ora
					if (mBufferStazione[4][j].equals("0")) 		//se ritardo uguale a 0 minuti
						remoteViews.setTextViewText(R.id.widget_rit5, " ");	//spazio vuoto
					else
						remoteViews.setTextViewText(R.id.widget_rit5, mBufferStazione[4][j]+"'");	//aggiungo apostrofo
					remoteViews.setTextViewText(R.id.widget_bin5, mBufferStazione[5][j].trim());	//binario reale oppure previsto
					break;
				case 5:
					//sesto treno
					remoteViews.setTextViewText(R.id.widget_num6, mBufferStazione[0][j].trim()+" "+mBufferStazione[1][j].trim()); 	//categoria+numero
					remoteViews.setTextViewText(R.id.widget_sta6, mBufferStazione[2][j].trim()); 	//stazione
					remoteViews.setTextViewText(R.id.widget_ora6, mBufferStazione[3][j].trim());	//ora
					if (mBufferStazione[4][j].equals("0")) 		//se ritardo uguale a 0 minuti
						remoteViews.setTextViewText(R.id.widget_rit6, " ");	//spazio vuoto
					else
						remoteViews.setTextViewText(R.id.widget_rit6, mBufferStazione[4][j]+"'");	//aggiungo apostrofo
					remoteViews.setTextViewText(R.id.widget_bin6, mBufferStazione[5][j].trim());	//binario reale oppure previsto
					break;
				}
			}
			else
			{
				for (int k=0;k<6;k++){
					mBufferStazione[k][j] = " ";
				}
			}
		}
	}

	private static boolean controllaConnessione(Context contesto) {
		ConnectivityManager connManager = (ConnectivityManager) contesto.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo netInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); //informazioni della connessione mobile
		NetworkInfo wifiInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); //informazioni della connessione WiFi
		if (netInfo.getState()!=NetworkInfo.State.CONNECTED && wifiInfo.getState()!=NetworkInfo.State.CONNECTED) {
			return false;
		} else {
			return true; //se connesso wifi o rete ritorna true
		}
	}

}
